Skip to content

[๐Ÿš€ ์‚ฌ์ดํด2 - ๋ฏธ์…˜ (๊ธฐ๋ฌผ ํ™•์žฅ + DB ์ ์šฉ)] ๋ˆ„๋ˆ„ ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.#342

Merged
her0807 merged 89 commits intowoowacourse:leejaehyeok97from
LEEJaeHyeok97:leejaehyeok97-step2
Apr 13, 2026

Conversation

@LEEJaeHyeok97
Copy link
Copy Markdown

@LEEJaeHyeok97 LEEJaeHyeok97 commented Apr 9, 2026

์•ˆ๋…•ํ•˜์„ธ์š”. ์ˆ˜๋‹ฌ, ๋‚˜๋ฆ„๋Œ€๋กœ ๊ณ ๋ฏผ ์ง€์ ์„ ๊ธฐ๋กํ•˜๋ฉด์„œ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ, DB๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ  ์ƒ์†Œํ•œ ์ฝ”๋“œ๋“ค์ด ๋งŽ์•„์ ธ์„œ ์ฒซ PR์ด ๋Šฆ์–ด์กŒ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ์Šค์Šค๋กœ ๊ณ ๋ฏผํ•˜๊ณ  ํ•œ๊ฐ€์ง€๋ผ๋„ ์˜๋ฏธ ์žˆ๋Š” ๊ฒƒ์„ ์–ป์–ด๊ฐ€๊ณ  ์‹ถ๋‹ค๋Š” ๋งˆ์Œ์—
์ด๋ฒˆ ๋ฏธ์…˜์— ๋Œ€๋ถ€๋ถ„์ด ์„ ํƒํ•˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์€ MongoDB๋ผ๋Š” NoSQL์„ ์„ ํƒํ–ˆ๊ณ  ์ฝ˜์†” ํ”„๋กœ๊ทธ๋žจ์˜ DB ์—ฐ๊ฒฐ๊ณผ ๋ชฝ๊ณ  ๋””๋น„์˜ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์ฒ˜์Œ ์•Œ์•„๊ฐ€๋ฉฐ ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์šด๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ด๋ฒˆ ๋ฆฌ๋ทฐ๋„ ์ž˜ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

์ฒดํฌ ๋ฆฌ์ŠคํŠธ

  • ๋ฏธ์…˜์˜ ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ–ˆ๋‚˜์š”?
  • Gradle test๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ†ต๊ณผํ–ˆ๋‚˜์š”?
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋‚˜์š”?

์–ด๋–ค ๋ถ€๋ถ„์— ์ง‘์ค‘ํ•˜์—ฌ ๋ฆฌ๋ทฐํ•ด์•ผ ํ• ๊นŒ์š”?

๊ณ ๋ฏผํ–ˆ๋˜ ์ง€์ .

  1. ๊ถ์„ฑ ๊ตฌํ˜„
    ๊ถ์„ฑ ์•ˆ์—์„œ์˜ ์ด๋™์ „๋žต์€ ๊ธฐ์กด MoveStrategy์— ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋ฉ”์†Œ๋“œ์˜ ์ˆ˜๋ฅผ ๋Š˜๋ ค์„œ ๊ฐ€๋…์„ฑ์„ ์ €ํ•ดํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
    ๋”ฐ๋ผ์„œ ๊ถ์„ฑ ์•ˆ์˜ ์ด๋™์ „๋žต์„ ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€๋…์„ฑ์— ์žฅ์ ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ์„ ํ•˜๋‹ค๊ฐ€,
    ํ•˜์ง€๋งŒ, ์ด๋™ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” getPath()๋ฅผ ๊ถ์„ฑ ์•ˆ์—์„œ๋„ ๊ธฐ์กด ์ด๋™ ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•˜์—ฌ ๊ถ์„ฑ ์•ˆ์˜ ์ด๋™์œ„์น˜๋ฅผ ๋ง๋ถ™์—ฌ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—๊ธฐ์กด ์ „๋žต์— ๊ถ์„ฑ ์กฐ๊ฑด์„ ๋‹จ์ˆœํžˆ ์ถ”๊ฐ€ํ•ด(๋ง๋ถ™์—ฌ) ์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ๋กœ์ง์„ ์ˆ˜์ •ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
    ๋ถ„๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์•˜์œผ๋‹ˆ ํ•œ ํด๋ž˜์Šค์˜ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ์กฐ๊ธˆ ๋ณด๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.
    ์ด ๊ฒฐ์ •์ด ๋‚˜์˜์ง€ ์•Š์€ ๊ฒฐ์ •์ธ์ง€ ๋ฆฌ๋ทฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

  2. ์™•์ด ์žกํžˆ๋Š” ๊ฒฝ์šฐ ๊ฒŒ์ž„์—์„œ ์ง„๋‹ค.
    ๋ณด๋“œ์—์„œ ์™•์ด ์‚ญ์ œ๋˜๋Š” ๊ฒฝ์šฐ ์ฆ‰์‹œ ๊ฒŒ์ž„์„ ์ข…๋ฃŒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
    ๋ณด๋“œ์˜ move์—์„œ ์ด๋™ํ•˜๋ฉฐ ๋””์˜คํ•  ์œ„์น˜์˜ ๊ธฐ๋ฌผ์„ ์ œ๊ฑฐํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด๋™ ๋ฉ”์†Œ๋“œ์— ๊ฒŒ์ž„ ์ข…๋ฃŒ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ์ฑ…์ž„๊นŒ์ง€ ๊ฐ–๊ฒŒ ํ•˜๋Š”
    ๊ฒƒ์€ ๊ณผ๋„ํ•œ ์ฑ…์ž„์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
    ๋”ฐ๋ผ์„œ, JanggiGame ๊ฐ์ฒด๋ฅผ ๋„์ž…ํ•˜์—ฌ ๊ฒŒ์ž„ ํ๋ฆ„์„ ๊ด€์ œํ•˜๊ณ  ๋ณด๋“œ๊ฐ์ฒด๋กœ ๋งคํ„ด ์žฅ๊ตฐ์˜ ์กด์žฌ๋ฅผ ์ฒดํฌํ•˜๊ฒŒ ํ•˜๊ณ  ๊ฒŒ์ž„ ์ข…๋ฃŒ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ
    ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
    JanggiGame ๊ฐ์ฒด๋ฅผ ๋„์ž…ํ•จ์œผ๋กœ์จ Board ๊ฐ์ฒด๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ์— ํ˜๋Ÿฌ๊ฐ„ ๊ฒƒ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  ์ด๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ๊ฐ์ฒด์ง€ํ–ฅ์  ๋…ธ๋ ฅ์˜ ์ˆ˜ํ™•์ด์—ˆ์Šต๋‹ˆ๋‹ค.

  3. ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉฐ์„œ ๋“  ๊ถ๊ธˆ์ฆ
    Controller์˜ ์ƒ์ฐจ๋ฆผ์ด ์ด๋ฆ„๊ณผ ์Œ์œผ๋กœ ๋งค์นญ๋˜๋Š”๋ฐ BiFunction์„ ์“ฐ๋ฉด Formation enumํด๋ž˜์Šค์—์„œ ํ•œ๋ฒˆ์— ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ๋งŒ ๊ฐ™์€๋ฐ ์ด ๊ฒฝ์šฐ Formation์ด Board๊ฐ์ฒด๋ฅผ ์˜์กดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Formation ์ฝ”๋“œ๋Š” ๋‹ค์†Œ ์ง€์ €๋ถ„ํ•ด์ง€๋Š” ์ฝ”๋“œ๊ฐ€ ๋˜๋Š”๋ฐ Controller์˜ ์ฝ”๋“œ๋Š” ์ƒ๋‹นํžˆ ๊น”๋”ํ•ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์„ค๊ณ„๊ฐ€ ์ ์ ˆํ•œ์ง€ ์˜๊ฒฌ์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

  4. JanggiGame ๊ฐ์ฒด
    ์ƒˆ๋กœ ์žฅ๊ธฐ๊ฒŒ์ž„ ๊ฐ์ฒด๋ฅผ ๋„์ž…ํ–ˆ๋Š”๋ฐ, ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ์“ฐ๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ํ„ด์„ ์นด์šดํŠธํ•˜๋Š” ๋ฐ์ดํ„ฐ์ธ turnCount๋Š” ๊ฐ€๋ณ€์ธ๋ฐ, ์ด ๋ถ€๋ถ„์—์„œ๋Š” ์™„์ „ํ•œ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ๋‚ด๋ถ€์˜ ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ ํ•˜๋‚˜๋งŒ ๋ฐ”๋€Œ์–ด๋„ ๋‹ค์‹œ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ํ•ด์น  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด์„œ ๊ฐ€๋ณ€์œผ๋กœ turnCount๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์ด ๊ดœ์ฐฎ์„์ง€ ๋ฆฌ๋ทฐ ์š”์ฒญ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

  5. DB ์—ฐ๊ฒฐ์— ๋”ฐ๋ฅธ DAO ๋„์ž…๊ณผ ๊ธฐ์กด MVC ํŒจํ„ด์˜ ํ™•์žฅ ์„ค๊ณ„

image

DB๋ฅผ ๋„์ž…ํ•˜๋ฉด์„œ ๊ธฐ์กด MVC ๊ตฌ์กฐ์— DAO ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
BoardDao๋ฅผ Controller์— ์ฃผ์ž…ํ•˜์—ฌ, Controller๊ฐ€ ๊ฒŒ์ž„ ํ๋ฆ„(์ƒˆ ๊ฒŒ์ž„/์ด์–ดํ•˜๊ธฐ)์— ๋”ฐ๋ผ DAO๋ฅผ ํ†ตํ•ด ๊ฒŒ์ž„ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณต์›ํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด ๊ณผ์ •์—์„œ ๊ณ ๋ฏผํ–ˆ๋˜ ์ ์€ DAO๊ฐ€ ๋„๋ฉ”์ธ ๊ฐ์ฒด(Board)๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๊ณผ์—ฐ ์ ์ ˆํ•œ๊ฐ€ ์ž…๋‹ˆ๋‹ค.
ํ˜„์žฌ findBoardByGameId()๋Š” Document(๋ชฝ๊ณ DB์˜ ๋ฌธ์„œ)๋ฅผ Board๋กœ ๋ฐ˜ํ™˜ํ•˜์—ฌ DAO๊ฐ€ ๋„๋ฉ”์ธ ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๋ฐฉ์‹์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
DTO๋Š” ์ข‹์€ ์„ ํƒ์ง€๊ฐ€ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ˜„์žฌ ๊ทœ๋ชจ์—์„œ๋Š” ์˜คํžˆ๋ ค ๊ณผํ•œ ์ถ”์ƒํ™”๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ(ํ˜„์žฌ ์ž‘์€ ๊ทœ๋ชจ๋ผ ๋ทฐ๋„ ๋„๋ฉ”์ธ์„ ์˜์กดํ•˜๊ณ  ์žˆ์Œ)
DAO๊ฐ€ ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.(์‹ค์„  ํ‘œ์‹œ)

  1. MongoDB ์‚ฌ์šฉ์— ๋”ฐ๋ฅธ ์žฅ๋‹จ์  ์ธ์‚ฌ์ดํŠธ
    ์žฅ์ :
  • ์Šคํ‚ค๋งˆ ์œ ์—ฐ์„ฑ: ์žฅ๊ธฐํŒ์˜ ๊ธฐ๋ฌผ ์ •๋ณด๋ฅผ pieces ๋ฐฐ์—ด๋กœ ํ•˜๋‚˜์˜ Document์— ๋‹ด์„ ์ˆ˜ ์žˆ์–ด, ๋ณ„๋„์˜ ํ…Œ์ด๋ธ” ์„ค๊ณ„(๊ฒŒ์ž„ ํ…Œ์ด๋ธ” + ๊ธฐ๋ฌผ ํ…Œ์ด๋ธ” + JOIN)๊ฐ€ ํ•„์š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์ƒํƒœ๋ฅผ ํ•˜๋‚˜์˜ ๋ฌธ์„œ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ํŠนํžˆ ์žฅ๊ธฐ ๋„๋ฉ”์ธ๊ณผ ์ž˜ ๋งž์•˜์Šต๋‹ˆ๋‹ค.
  • ๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ดํ•‘: DDL ์ž‘์„ฑ์ด๋‚˜ ์Šคํ‚ค๋งˆ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์—†์ด ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด, ๋„๋ฉ”์ธ ๋กœ์ง ๊ตฌํ˜„์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ObjectId ์ž๋™ ์ƒ์„ฑ: ๋ณ„๋„์˜ ์‹œํ€€์Šค๋‚˜ Auto Increment ์„ค์ • ์—†์ด ๊ณ ์œ ํ•œ ํƒ€์ž„ ์Šคํ…œํ”„ ๊ธฐ๋ฐ˜ ๊ฒŒ์ž„ ID๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ :

  • ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” ๋น„์šฉ: Board โ†” Document ๋ณ€ํ™˜์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. Team, Type ๊ฐ™์€ Enum์„ ๋ฌธ์ž์—ด๋กœ ์ €์žฅํ•˜๊ณ  ๋‹ค์‹œ ์ฐพ์•„์˜ค๋Š” ๊ณผ์ •(findTeamByName, findTypeByName)์ด ํ•„์š”ํ–ˆ๊ณ ,RDBMS + ORM์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ์ด ๋ถ€๋ถ„์ด ๋” ๊ฐ„๊ฒฐํ–ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜ ๋ฏธ์ง€์›(๋‹จ์ผ ๋…ธ๋“œ): ํ˜„์žฌ ๊ตฌ์กฐ์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ, ๊ฒŒ์ž„ ์ƒํƒœ ์ €์žฅ์ด ์—ฌ๋Ÿฌ ์ปฌ๋ ‰์…˜์— ๊ฑธ์น˜๊ฒŒ ๋œ๋‹ค๋ฉด ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๊ฐ€ RDBMS๋ณด๋‹ค ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ธ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค

Copy link
Copy Markdown

@her0807 her0807 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์•ˆ๋…•ํ•˜์„ธ์š” ๋ˆ„๋ˆ„! ใ…Žใ…Ž

๋ชฝ๊ณ ๋””๋น„๋ฅผ ์—ฐ๊ฒฐํ•ด๋ณด์…จ๊ตฐ์š”?

์ ์–ด์ฃผ์‹  ๋‚ด์šฉ์œผ๋กœ ๋ฏธ๋ฃจ์–ด๋ณด์•˜์„ ๋•Œ ์ „๊ณต์ž ์ด์‹ ๊ฒƒ ๊ฐ™์€๋ฐ ๋งž์„๊นŒ์š”?
ํ˜น์‹œ ๋‹ค๋ฅธ ๋””๋น„๋“ค์„ ์‚ฌ์šฉํ•ด๋ณด์‹œ๊ณ  ๋ชฝ๊ณ ๋””๋น„๋ฅผ ์—ฐ๊ฒฐํ•ด๋ณด์‹  ๊ฒƒ์ธ์ง€, ๋น„์ •ํ˜•๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋””๋น„๋„ ๋ชฝ๊ณ ๋””๋น„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋””๋น„๋“ค๋„ ์žˆ๋Š”๋ฐ ์–ด๋–ค์ด์œ ๋กœ ์„ ํƒํ–ˆ๋Š”์ง€ ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ๋“ฃ๊ณ ์‹ถ์–ด์š”!

Comment thread src/main/java/domain/JanggiGame.java
Comment thread src/main/java/domain/strategy/ChariotMoveStrategy.java Outdated
Comment on lines 32 to +51
@@ -38,6 +43,40 @@ private boolean isNotCorrectPath(final Position from, final Position to) {
return true;
}

if (hanSoldierCanDiagonalMoveInPalace(from, to) || chuSoldierCanDiagonalMoveInPalace(from, to)) {
return true;
}

return false;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋Œ€๊ฐ์„  ์ด๋™์„ ์ฐจ๋‹จํ•˜๋Š” ์œ„์น˜ ๋ชฉ๋ก (0,4), (9,4) ๊ฐ€ ๋ˆ„๋ฝ๋œ ๊ฒƒ ๊ฐ™์•„์š”! ๐Ÿ‘€
๊ถ์„ฑ ๋Œ€๊ฐ์„ ์€ ์ค‘์•™(1,4)/(8,4)๊ณผ ๊ผญ์ง“์ ๋งŒ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฑด๋ฐ์š”, (0,4)๋Š” ๊ถ์„ฑ ์ƒ๋‹จ ๋ณ€์˜ ์ค‘๊ฐ„์ด๋ผ ๋Œ€๊ฐ์„  ๋ผ์ธ ์œ„์— ์—†๊ฑฐ๋“ ์š”. ํ˜„์žฌ ์ฝ”๋“œ์—์„œ ๊ถ(General)์ด (0,4)โ†’(1,5)๋กœ ๋Œ€๊ฐ์„  ์ด๋™์ด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค!

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋ˆ„๋ฝ๋œ ๋ถ€๋ถ„ ์ถ”๊ฐ€ํ•˜๊ณ  ํ…Œ์ŠคํŠธ๊นŒ์ง€ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค!
๋ณด์‹œ๋‹ค์‹œํ”ผ ์ด๋ ‡๊ฒŒ ๋งŽ์€ ์กฐ๊ฑด๋“ค์ด || ์—ฐ์‚ฐ์œผ๋กœ ์ด์–ด์ง€๋ฉด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์‹œ ๋ฏธ์Šค๊ฐ€ ๋‚  ํ™•๋ฅ ์ด ๋†’์•„์ง€๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ, ๊ฐ์ฒด ์ง€ํ–ฅ์  ์„ค๊ณ„๊ฐ€ ์ž˜๋ชป๋œ ์‹ ํ˜ธ๋กœ ๋ณผ ์ˆ˜ ์žˆ์„๊นŒ์š”?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์กฐ๊ฑด ์—ฐ์‚ฐ์ด ๋งŽ์•„์ง€๋Š”๊ฒŒ ์„ค๊ณ„๊ฐ€ ์ž˜๋ชป๋œ ์‹ ํ˜ธ์ผ ์ˆ˜๋„ ์žˆ๊ณ , ํ˜น์€ ๋„๋ฉ”์ธ์ด ๋ณต์žกํ•ด์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ผ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”. ใ…Žใ…Ž
ํ•ด๋‹น ๋ถ€๋ถ„์„ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋กœ ๋ฏธ์Šค๋‚  ํ™•๋ฅ ์„ ๋ณด์™„ํ•˜๊ฑฐ๋‚˜ ์กฐ๊ฑด๋“ค์„ ๋‹จ์œ„์— ๋งž์ถฐ์„œ ์กฐ๊ฑด์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋„๋ฉ”์ธ์— ๋ฉ”์„ธ์ง€๋ฅผ ๋‚ ๋ฆฌ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋ฆฌํŒฉํ„ฐ๋งํ•ด๋ด๋„ ์ข‹์„๋“ฏ ํ•ด์š”

Comment thread src/main/java/controller/JanggiController.java
Comment thread src/main/java/domain/Board.java
Comment thread src/main/java/dao/mongodb/BoardDao.java Outdated
Comment thread src/main/java/dao/mongodb/BoardDao.java Outdated
Comment on lines +90 to +95

collection.replaceOne(
Filters.eq("_id", new ObjectId(gameId)),
updateDoc
);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋ˆ„๋ˆ„๊ฐ€ ์ •๋ฆฌํ•œ MongoDB ์žฅ์  ์ค‘ ์Šคํ‚ค๋งˆ ์œ ์—ฐ์„ฑ: pieces ๋ฐฐ์—ด๋กœ ํ•˜๋‚˜์˜ Document์— ๋‹ด์„ ์ˆ˜ ์žˆ์–ด JOIN์ด ๋ถˆํ•„์š”๋ผ๋Š” ๋ถ€๋ถ„์ด ์žˆ์—ˆ๋Š”๋ฐ์š”, ํ•œ ๊ฐ€์ง€ ๋” ๊นŠ์ด ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.

ํ˜„์žฌ ๊ตฌ์กฐ์—์„œ๋Š” ๋งค ํ„ด๋งˆ๋‹ค ์ „์ฒด ๊ธฐ๋ฌผ ๋ฐฐ์—ด์„ ํ†ต์งธ๋กœ ๊ต์ฒดํ•˜๊ณ  ์žˆ์–ด์š”.

RDBMS์˜€๋‹ค๋ฉด ์ด๋™ํ•œ ๊ธฐ๋ฌผ 1~2๊ฐœ๋งŒ UPDATEํ•˜๋ฉด ๋˜๋Š”๋ฐ, MongoDB Document ๊ตฌ์กฐ์—์„œ๋Š” ๊ธฐ๋ฌผ 32๊ฐœ๋ฅผ ๋งค๋ฒˆ ์ „๋ถ€ ์ง๋ ฌํ™”ํ•ด์„œ ์ €์žฅํ•˜๊ณ  ์žˆ๊ฑฐ๋“ ์š”. ์ด trade-off๋ฅผ ์ธ์ง€ํ•˜๊ณ  ์žˆ์—ˆ๋‚˜์š”? ํ˜„์žฌ ๊ทœ๋ชจ์—์„œ๋Š” ๋ฌธ์ œ ์—†์ง€๋งŒ, Document๋กœ ํ•œ ๋ฒˆ์— ๋‹ด๋Š” ๊ฒŒ ํ•ญ์ƒ ์ข‹์€ ๊ฑด์ง€ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”!

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR ์„ค๋ช…์—์„œ ์ด๋ ‡๊ฒŒ ์ ์–ด์ฃผ์…จ๋Š”๋ฐ์š”!

ํŠธ๋žœ์žญ์…˜ ๋ฏธ์ง€์›(๋‹จ์ผ ๋…ธ๋“œ): ํ˜„์žฌ ๊ตฌ์กฐ์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ, ๊ฒŒ์ž„ ์ƒํƒœ ์ €์žฅ์ด ์—ฌ๋Ÿฌ ์ปฌ๋ ‰์…˜์— ๊ฑธ์น˜๊ฒŒ ๋œ๋‹ค๋ฉด ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๊ฐ€ RDBMS๋ณด๋‹ค ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ธ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๋ถ€๋ถ„์€ ์‚ฌ์‹ค ์ •ํ™•ํ•˜์ง€ ์•Š์•„์š”! MongoDB๋Š” 4.0(2018๋…„)๋ถ€ํ„ฐ ๋ฉ€ํ‹ฐ ๋„ํ๋จผํŠธ ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๋ˆ„๊ฐ€ ์‚ฌ์šฉ ์ค‘์ธ ๋“œ๋ผ์ด๋ฒ„(mongodb-driver-sync:5.3.1)๋„ ๋‹น์—ฐํžˆ ์ง€์›ํ•˜๊ณ ์š”.

// MongoDB์—์„œ๋„ ํŠธ๋žœ์žญ์…˜์ด ๊ฐ€๋Šฅํ•ด์š”
try (ClientSession session = client.startSession()) {
    session.startTransaction();
    collection1.insertOne(session, doc1);
    collection2.insertOne(session, doc2);
    session.commitTransaction();
}

๋‹ค๋งŒ ๋ˆ„๋ˆ„์˜ ํ˜„์žฌ ๊ตฌ์กฐ์—์„œ๋Š” ๊ฒŒ์ž„ ์ƒํƒœ๊ฐ€ ๋‹จ์ผ Document ํ•˜๋‚˜์— ์ „๋ถ€ ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋žœ์žญ์…˜์ด ํ•„์š” ์—†๋Š” ๊ตฌ์กฐ์ด๊ธด ํ•ด์š”. MongoDB๋Š” ๋‹จ์ผ Document์— ๋Œ€ํ•œ ์›์ž์  ์“ฐ๊ธฐ๋ฅผ ๊ธฐ๋ณธ ๋ณด์žฅํ•˜๊ฑฐ๋“ ์š”. ๊ทธ๋ž˜์„œ replaceOne()์ด ์ค‘๊ฐ„์— ์‹คํŒจํ•ด๋„ ๋ฐ˜์ฏค ์ €์žฅ๋˜๋Š” ์ผ์€ ์—†์–ด์š”.

์ •๋ฆฌํ•˜๋ฉด, ํŠธ๋žœ์žญ์…˜์ด ์•ˆ ๋ผ์„œ ๊นŒ๋‹ค๋กญ๋‹ค๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹จ์ผ Document ๊ตฌ์กฐ๋ผ์„œ ํŠธ๋žœ์žญ์…˜์ด ์• ์ดˆ์— ํ•„์š” ์—†๋‹ค๊ฐ€ ๋” ์ •ํ™•ํ•œ ํ‘œํ˜„์ด์—์š”!

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์žฅ๊ธฐ ๋„๋ฉ”์ธ์— MongoDB๊ฐ€ ์ •๋ง ์ ํ•ฉํ•œ ์„ ํƒ์ผ๊นŒ? ๐Ÿค”

๋ˆ„๋ˆ„๊ฐ€ MongoDB๋ฅผ ์„ ํƒํ•œ ๋„์ „ ์ •์‹ ์€ ์ •๋ง ์ข‹์•˜์–ด์š”! ๋‹ค๋งŒ ์†”์งํ•˜๊ฒŒ ์ด์•ผ๊ธฐํ•˜๋ฉด, ์žฅ๊ธฐ๋Š” RDBMS๊ฐ€ ๋” ์ž์—ฐ์Šค๋Ÿฌ์šด ๋„๋ฉ”์ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”. ์ด์œ ๋ฅผ ๋ช‡ ๊ฐ€์ง€ ์ •๋ฆฌํ•ด๋ณผ๊ฒŒ์š”.

์žฅ๊ธฐ๊ฐ€ RDBMS์— ๋” ๋งž๋Š” ์ด์œ 

  • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ๋งค์šฐ ๊ณ ์ •์ ์ด์—์š”. 9x10 ๋ณด๋“œ, ๊ณ ์ •๋œ ๊ธฐ๋ฌผ ํƒ€์ž…, ๊ณ ์ •๋œ ํŒ€ โ€” ์Šคํ‚ค๋งˆ๊ฐ€ ๋ณ€ํ•  ์ผ์ด ์—†์–ด์š”, ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ชฝ๊ณ ๋””๋น„์˜ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ด์ ์„ ๋ชป๋ˆ„๋ฆฌ๋Š” ์ƒํ™ฉ์ด์—์š”.
  • ๊ธฐ๋ฌผ ์ด๋™์€ 1~2๊ฐœ ํ–‰๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋˜๋Š”๋ฐ, Document ๊ตฌ์กฐ๋Š” ๋งค๋ฒˆ 32๊ฐœ ๊ธฐ๋ฌผ์„ ์ „๋ถ€ ์ง๋ ฌํ™”ํ•ด์•ผ ํ•ด์š”
  • "์ง„ํ–‰ ์ค‘์ธ ๊ฒŒ์ž„ ๋ชฉ๋ก", "ํŠน์ • ํ”Œ๋ ˆ์ด์–ด์˜ ์ „์ " ๊ฐ™์€ ์ฟผ๋ฆฌ๋Š” RDBMS๊ฐ€ ํ›จ์”ฌ ์ž์—ฐ์Šค๋Ÿฌ์›Œ์š”
  • ์Šคํ‚ค๋งˆ ๊ฐ•์ œ๊ฐ€ ์˜คํžˆ๋ ค ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ ์ €์žฅ์„ ๋ฐฉ์ง€ํ•ด์ค˜์š” ์˜ˆ๋ฅผ๋“ค๋ฉด piece_type์— ์˜คํƒ€๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด ์ œ์•ฝ ์กฐ๊ฑด์—์„œ ์žกํžˆ๋‹ˆ๊นŒ์š”. ์ง€๊ธˆ์€ ์ž˜๋ชป ์ €์žฅ๋˜๋ฉด ๋‚˜์ค‘์— enum ์ด๋‚˜ ๋‹ค๋ฅธ๊ฑธ๋กœ ์กฐํšŒํ•  ๋•Œ ์บ์ŠคํŒ…ํ•˜๋Š” ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๊ฒ ์ฃ ?

MongoDB๊ฐ€ ๋น›๋‚˜๋Š” ๋„๋ฉ”์ธ์€

  • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์œ ๋™์ ์ธ ๊ฒฝ์šฐ (์˜ˆ: ์‚ฌ์šฉ์ž๋ณ„ ์„ค์ •, ๋กœ๊ทธ, CMS ์ฝ˜ํ…์ธ )
  • ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ
  • ์ˆ˜ํ‰ ํ™•์žฅ์ด ํ•„์š”ํ•œ ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ

๋ฌผ๋ก  ํ˜„์žฌ ๋ฏธ์…˜ ๋ฒ”์œ„์—์„œ๋Š” ๋‘˜ ๋‹ค ์ถฉ๋ถ„ํžˆ ๋™์ž‘ํ•˜๊ณ , MongoDB๋ฅผ ์ง์ ‘ ์จ๋ณธ ๊ฒฝํ—˜ ์ž์ฒด๊ฐ€ ๊ท€ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”. ํ•™์Šต๋ชฉ์ ์œผ๋กœ ์„ ํƒํ•œ๊ฒƒ๋„ ์ด์œ ๊ฐ€ ๋˜๋‹ˆ๊นŒ์š”!

Copy link
Copy Markdown
Author

@LEEJaeHyeok97 LEEJaeHyeok97 Apr 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MongoDB ์— ๋Œ€ํ•ด ์ฐพ์•„๋ณด๋‹ˆ RDB ์ฒ˜๋Ÿผ ํŠน์ • ํ•„๋“œ๋งŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ๋“ค์ด ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค.

//ํ•ต์‹ฌ ์ฐจ์ด๋Š” replaceOne์€ _id๋ฅผ ์ œ์™ธํ•œ ๋ฌธ์„œ ์ „์ฒด๋ฅผ ์ƒˆ ๋ฌธ์„œ๋กœ ๋ฎ์–ด์“ฐ์ง€๋งŒ,
// updateOne + $set์€ ์ง€์ •ํ•œ ํ•„๋“œ๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ  ๋‚˜๋จธ์ง€ ํ•„๋“œ๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

public void update(String gameId, List<PieceDto> pieces, int turnCount) {
        ArrayList<Document> pieceDocuments = new ArrayList<>();

        for (PieceDto pieceDto : pieces) {
            pieceDocuments.add(toDocument(pieceDto));
        }

        Document updateFields = new Document("$set", new Document()
                .append("pieces", pieceDocuments)
                .append("turnCount", turnCount));

        collection.updateOne(
                Filters.eq("_id", new ObjectId(gameId)),
                updateFields
        );
    }

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ „์ฒด ๋ฌธ์„œ๋ฅผ ๋ฎ์–ด์“ฐ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ํŠน์ • ํ•„๋“œ๋งŒ ๋ฐ”๊พธ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์šฐ์„ , NoSQL์— ๊ด€ํ•œ ์ œ ์ƒ๊ฐ์„ ๋ง์”€๋“œ๋ฆฌ๊ณ  ์‹ถ์–ด์š”.

NoSQL์€ ๋‹จ์ˆœํžˆ "๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ์šฉ"์ด๋ผ๋Š” ํ”„๋ ˆ์ž„์— ๊ฐ€๋‘๊ธฐ์—” ๊ทธ ์ฒ ํ•™์ด ๋” ๋„“๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์›๊ธ€์—์„œ "Document ๊ตฌ์กฐ๋Š” ๋งค๋ฒˆ 32๊ฐœ ๊ธฐ๋ฌผ์„ ์ „๋ถ€ ์ง๋ ฌํ™”ํ•ด์•ผ ํ•œ๋‹ค"๊ณ  ํ•˜์…จ๋Š”๋ฐ, ์ด๋Š” MongoDB๋ฅผ replaceOne์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.(์ €์˜ ์ž˜๋ชป๋œ ๊ตฌํ˜„ใ… ใ… ) ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ updateOne + $set ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ํ•„๋“œ๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค! ํ•ต์‹ฌ ์ฐจ์ด๋Š” replaceOne์€ _id๋ฅผ ์ œ์™ธํ•œ ๋ฌธ์„œ ์ „์ฒด๋ฅผ ๋ฎ์–ด์“ฐ์ง€๋งŒ, updateOne + $set์€ ์ง€์ •ํ•œ ํ•„๋“œ๋งŒ ๊ฐฑ์‹ ํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ ์ œ๊ฐ€ ์ž˜๋ชป ๊ตฌํ˜„ํ•ด์„œ ์˜คํ•ด๋ฅผ ๋“œ๋ฆฐ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. "๋งค๋ฒˆ ์ „๋ถ€ ์ง๋ ฌํ™”ํ•ด์•ผ ํ•œ๋‹ค"๋Š” MongoDB์˜ ๋ณธ์งˆ์  ํ•œ๊ณ„๊ฐ€ ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ ๋ฐฉ์‹์˜ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.

์ตœ๊ทผ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ Redis๋ผ๋Š” ์ฑ…์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ณณ์—์„œ NoSQL์€ ๊ธฐ์กด RDB์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ผ๋Š” ๋ฌธ๊ตฌ๋ฅผ ์ฝ์€ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ € ๋˜ํ•œ RDB๊ฐ€ ACID๋ฅผ ์ง€์ผœ์„œ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์—„๊ฒฉํžˆ ์ง€ํ‚จ๋‹ค๋Š” ์ ์—์„œ ์žฅ์ ์ด ๋งŽ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ NoSQL์€ ๊ทธ ์—„๊ฒฉํ•จ์„ ์˜๋„์ ์œผ๋กœ ์™„ํ™”ํ•˜๋Š” ๋Œ€์‹ , ์œ ์—ฐ์„ฑ๊ณผ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์ด๋ผ๋Š” ๋‹ค๋ฅธ ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์žฅ๊ธฐ ๋„๋ฉ”์ธ์ฒ˜๋Ÿผ ์Šคํ‚ค๋งˆ๊ฐ€ ๊ณ ์ •์ ์ด๋ผ ํ•ด๋„, ๊ทธ ๊ณ ์ •๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ๋ฌธ์„œ๋กœ ์‘์ง‘๋ ฅ ์žˆ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ MongoDB์˜ ์žฅ์ ์ž…๋‹ˆ๋‹ค.

"๊ณ ์ •๋œ ์Šคํ‚ค๋งˆ = RDBMS"๋ผ๋Š” ๋“ฑ์‹์— ๋Œ€ํ•ด์„œ๋„ ์ƒ๊ฐํ•ด๋ณผ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์žฅ๊ธฐ ๊ฒŒ์ž„ ํ•˜๋‚˜๋ฅผ RDBMS๋กœ ๋ชจ๋ธ๋งํ•˜๋ฉด games ํ…Œ์ด๋ธ”, pieces ํ…Œ์ด๋ธ”, moves ํ…Œ์ด๋ธ” ๋“ฑ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ„์‚ฐ๋˜๊ณ , ๊ฒŒ์ž„ ์ƒํƒœ๋ฅผ ์กฐํšŒํ•  ๋•Œ๋งˆ๋‹ค JOIN์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด MongoDB๋Š” ํ•˜๋‚˜์˜ Document ์•ˆ์— ๊ฒŒ์ž„์˜ ์ „์ฒด ์ƒํƒœ๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” "๊ฒŒ์ž„ ํ•˜๋‚˜๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค"๋Š” ๊ฐ€์žฅ ๋นˆ๋ฒˆํ•œ ์—ฐ์‚ฐ์—์„œ ์˜คํžˆ๋ ค ๋” ์ง๊ด€์ ์ด๊ณ  ํšจ์œจ์ ์ธ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณ ์ •์ ์ด๋ผ๋Š” ๊ฒƒ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ค ๋‹จ์œ„๋กœ ๋ฌถ์–ด์„œ ๋‹ค๋ฃจ๋А๋ƒ๋Š” ๋ณ„๊ฐœ์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์Šคํ‚ค๋งˆ ๊ฒ€์ฆ์— ๋Œ€ํ•ด์„œ๋„ MongoDB๋Š” ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
MongoDB๋Š” Schema Validation ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. piece_type์— ์˜คํƒ€๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๋ฌธ์ œ๋Š” RDBMS์˜ ์ œ์•ฝ ์กฐ๊ฑด๋งŒ์œผ๋กœ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, MongoDB์˜ JSON Schema Validation์ด๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์˜ enum ๊ฒ€์ฆ์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ ๋Œ€์‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์ด DB ์ข…๋ฅ˜์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋” ๊ฒฌ๊ณ ํ•œ ๋ฐฉ์–ด์„ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ชฝ๊ณ ๋””๋น„ ์Šคํ‚ค๋งˆ ๊ฒ€์ฆ ๋„ฃ๊ธฐ
https://velog.io/@lemix777/MongoDB-%EC%8A%A4%ED%82%A4%EB%A7%88-%EC%9C%A0%ED%9A%A8%EC%84%B1-%EA%B2%80%EC%82%AC

Copy link
Copy Markdown

@her0807 her0807 Apr 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋ˆ„๋ˆ„๊ฐ€ ์ด๋ ‡๊ฒŒ ๊นŠ์ด ๊ณ ๋ฏผํ•˜๊ณ  ๋‹ต๋ณ€ํ•ด์ฃผ์…”์„œ ๋„ˆ๋ฌด ์ข‹์•„์š”! ์ฑ…๊นŒ์ง€ ์ฝ์–ด๋ณด์…จ๋‹ค๋‹ˆ ์ •๋ง ๋ฉ‹์ ธ์š”. ๋‹ค๋งŒ ๋ช‡ ๊ฐ€์ง€ ์งš์–ด๋ณด๊ณ  ์‹ถ์€ ๋ถ€๋ถ„์ด ์žˆ์–ด์„œ ๋‹ค์‹œ ์˜๊ฒฌ ๋‚จ๊ฒจ์š”.

MongoDB๋„ ๋ถ€๋ถ„ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋œ๋‹ค๋Š” ๋‹ต๋ณ€์— ๋Œ€ํ•ด

updateOne + $set์„ ์•Œ๋ ค์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ด์š”! ์ œ๊ฐ€ replaceOne ๊ธฐ์ค€์œผ๋กœ๋งŒ ์ด์•ผ๊ธฐํ•œ ๊ฑด ๋งž์•„์š”. ๋‹ค๋งŒ ์ด ๋‹ต๋ณ€์„ ์ฝ์œผ๋ฉด์„œ ํ•œ ๊ฐ€์ง€ ์ƒ๊ฐ์ด ๋“ค์—ˆ์–ด์š”.

MongoDB๋„ RDBMS์ฒ˜๋Ÿผ ํŠน์ • ํ•„๋“œ๋งŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”
MongoDB๋„ RDBMS์ฒ˜๋Ÿผ ์Šคํ‚ค๋งˆ ๊ฒ€์ฆ์„ ํ•  ์ˆ˜ ์žˆ์–ด์š”

์ด ๋‹ต๋ณ€๋“ค์˜ ๊ณตํ†ต์ ์€ MongoDB๋„ RDBMS์ฒ˜๋Ÿผ ~ํ•  ์ˆ˜ ์žˆ๋‹ค์˜ˆ์š”. ๊ทธ๋Ÿฐ๋ฐ RDBMS์ฒ˜๋Ÿผ ์“ธ ๊ฑฐ๋ฉด RDBMS๋ฅผ ์“ฐ๋ฉด ๋˜์ง€ ์•Š์„๊นŒ์š”?

๋„๊ตฌ๋ฅผ ์„ ํƒํ•  ๋•Œ ์ด ๋„๊ตฌ๋กœ๋„ X๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ฐ€ ๊ทผ๊ฑฐ๊ฐ€ ๋˜๋ฉด ์ข€ ์œ„ํ—˜ํ•ด์š”. ๊ทธ๋Ÿผ ๋ชจ๋“  ๋„๊ตฌ๊ฐ€ ๋‹ค ๊ฐ™์•„์ง€๊ฑฐ๋“ ์š”. ์ง„์งœ ์ƒ๊ฐํ•ด๋ณผ ์ง€์ ์€ ์ด ๋„๋ฉ”์ธ์—์„œ MongoDB๊ฐ€ RDBMS๋ณด๋‹ค ๋” ์ž˜ํ•˜๋Š” ๊ฒŒ ๋ญ”๊ฐ€?์˜ˆ์š”.

MongoDB์˜ ์ง„์งœ ๊ฐ•์ ์€ ์–ด๋””์„œ ๋น›๋‚˜๋‚˜์š”?

MongoDB๊ฐ€ ์ •๋ง ๋น›๋‚˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์ด์ „์— ๋งํ–ˆ๋“ฏ ์•„๋ž˜์™€ ๊ฐ™์•„์š”.

  • ์Šคํ‚ค๋งˆ๊ฐ€ ์ž์ฃผ ๋ณ€ํ•˜๋Š” ๊ฒฝ์šฐ (CMS, ์‚ฌ์šฉ์ž ํ”„๋กœํ•„, ๋กœ๊ทธ)
  • ์ฝ๊ธฐ/์“ฐ๊ธฐ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  eventual consistency๋ฅผ ๋ฐ›์•„๋“ค์ด๋Š” ๊ฒฝ์šฐ (์†Œ์…œ ํ”ผ๋“œ, ์•Œ๋ฆผ)
  • ๊ณ„์ธต์  ๋ฐ์ดํ„ฐ๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ (ํŠธ๋ฆฌ, ์ค‘์ฒฉ ๋Œ“๊ธ€)

์žฅ๊ธฐ ๊ฒŒ์ž„์€ ์ด ์ค‘ ์–ด๋””์—๋„ ํ•ด๋‹นํ•˜์ง€ ์•Š์•„์š”. ๋ˆ„๋ˆ„๊ฐ€ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณ ์ •์ ์ด๋ผ๋Š” ๊ฒƒ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ค ๋‹จ์œ„๋กœ ๋ฌถ๋А๋ƒ๋Š” ๋ณ„๊ฐœ๋ผ๊ณ  ํ•˜์…จ๋Š”๋ฐ, ๊ทธ ๋ง์€ ๋งž์•„์š”. ๋‹ค๋งŒ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋ฌถ๊ณ  ์‹ถ๋‹ค๊ฐ€ MongoDB๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒฐ์ •์  ์ด์œ ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š”๊ฐ€?๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ์˜ˆ์š”.

ํ•˜๋‚˜์˜ Document๋กœ ์‘์ง‘์ด ์ง„์งœ MongoDB๋งŒ์˜ ๊ฐ•์ ์ธ๊ฐ€์š”?

PostgreSQL์˜ JSONB, MySQL์˜ JSON ์ปฌ๋Ÿผ์„ ๋ณด๋ฉด, ์‚ฌ์‹ค ํ˜„๋Œ€ RDBMS๋„ ํ•˜๋‚˜์˜ row์— ๋ณต์žกํ•œ JSON ๊ตฌ์กฐ๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ์–ด์š”. PostgreSQL JSONB๋Š” ์ธ๋ฑ์‹ฑ๋„ ๋˜๊ณ  ๋ถ€๋ถ„ ์—…๋ฐ์ดํŠธ๋„ ๋ผ์š”.

MySql ์—์„œ ํ•„๋“œ ์ž์ฒด๋ฅผ json ์œผ๋กœ ์ €์žฅํ•ด์„œ ๊บผ๋‚ด ์“ธ ์ˆ˜๋„ ์žˆ์–ด์š”.

-- PostgreSQL์—์„œ ๊ฒŒ์ž„ ํ•˜๋‚˜๋ฅผ ํ•œ row์— ๋‹ด๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅ
CREATE TABLE games (
    id BIGSERIAL PRIMARY KEY,
    pieces JSONB NOT NULL,
    turn_count INT NOT NULL
);

UPDATE games SET pieces = jsonb_set(pieces, '{0}', '...') WHERE id = 1;

๊ทธ๋ž˜์„œ Document๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” MongoDB์˜ ๊ณ ์œ ํ•œ ๊ฐ•์ ์ด๋ผ๊ธฐ๋ณด๋‹ค๋Š”, ๋ชจ๋˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ณตํ†ต ๊ธฐ๋Šฅ์— ๊ฐ€๊นŒ์›Œ์š”.

Schema Validation ์ถ”๊ฐ€๋Š” MongoDB์˜ ์–‘๋ณด๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”.

์ด๊ฑด ์ข€ ๋„๋ฐœ์ ์ธ ํ‘œํ˜„์ด๊ธด ํ•œ๋ฐ์š”, MongoDB๊ฐ€ Schema Validation์„ ๋„์ž…ํ•œ ๊ฑด ์Šคํ‚ค๋งˆ ์—†๋Š” ์ž์œ ๋กœ์›€์ด ์‹ค๋ฌด์—์„œ ๋„ˆ๋ฌด ๋งŽ์€ ๋ฐ์ดํ„ฐ ์˜ค์—ผ์„ ์ผ์œผ์ผฐ๊ธฐ ๋•Œ๋ฌธ์ด์—์š”. NoSQL์˜ ์ดˆ๊ธฐ ์ฒ ํ•™("์Šคํ‚ค๋งˆ๋Š” ์ž์œ ๋‹ค!")์ด ์‹ค์ œ ์šด์˜์—์„œ ํ•œ๊ณ„๊ฐ€ ์žˆ์—ˆ๋‹ค๋Š” ๊ฑธ ์ธ์ •ํ•œ ๊ฑฐ์ฃ .

๊ทธ๋ž˜์„œ ๋ˆ„๋ˆ„๊ฐ€ MongoDB๋„ Schema Validation์œผ๋กœ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜์‹  ๊ฑด ๋งž์ง€๋งŒ, ๊ทธ ๊ธฐ๋Šฅ์„ ์“ฐ๋Š” ์ˆœ๊ฐ„ RDBMS์˜ ์žฅ์ ์„ ํ‰๋‚ด๋‚ด๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๊ฑฐ๋“ ์š”. ์ฒ˜์Œ๋ถ€ํ„ฐ RDBMS๋ฅผ ์“ฐ๋ฉด ๊ทธ ๊ฒ€์ฆ์ด ๊ทธ๋ƒฅ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋”ฐ๋ผ์™€์š”.

๋‹ค์‹œ ๋Œ์•„์™€์„œ NoSQL์˜ ์ฒ ํ•™์ด ์ •ํ™•ํžˆ ๋ญ˜๊นŒ์š”?

๋ˆ„๋ˆ„๊ฐ€ NoSQL์€ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ์šฉ์ด๋ผ๋Š” ํ”„๋ ˆ์ž„์— ๊ฐ€๋‘๊ธฐ์—” ๊ทธ ์ฒ ํ•™์ด ๋” ๋„“๋‹ค ํ•˜์…จ๋Š”๋ฐ, ๊ทธ ๋” ๋„“์€ ์ฒ ํ•™์ด ๊ตฌ์ฒด์ ์œผ๋กœ ๋ญ˜๊นŒ์š”?

์ œ ์ƒ๊ฐ์—๋Š” NoSQL์˜ ๋ณธ์งˆ์  trade-off๋Š” CAP ์ •๋ฆฌ์—์„œ ๋‚˜์˜จ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”.

  • ์ผ๊ด€์„ฑ(Consistency)์„ ์–‘๋ณดํ•˜๊ณ  ๊ฐ€์šฉ์„ฑ(Availability)๊ณผ ๋ถ„ํ•  ๋‚ด์„ฑ(Partition tolerance)์„ ์–ป๋Š”๋‹ค
  • ACID ๋Œ€์‹  BASE๋ฅผ ๋ฐ›์•„๋“ค์ธ๋‹ค

์žฅ๊ธฐ ๊ฒŒ์ž„์—์„œ ์ด trade-off๋ฅผ ๋ฐ›์•„๋“ค์˜€๋‚˜์š”?

  • ๊ฐ€์šฉ์„ฑ์ด ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•œ๊ฐ€? (ํ•œ ์‚ฌ๋žŒ์ด ํ•˜๋Š” ๊ฒŒ์ž„)
  • ๋ถ„ํ•  ๋‚ด์„ฑ์ด ํ•„์š”ํ•œ๊ฐ€? (์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ๊ฑธ์นœ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ?)
  • eventual consistency๊ฐ€ ๊ฒŒ์ž„์— ์ ํ•ฉํ•œ๊ฐ€? (ํ„ด์ด ์‚ด์ง ๋Šฆ๊ฒŒ ๋ฐ˜์˜๋ผ๋„ ๊ดœ์ฐฎ์€๊ฐ€?)

์•„๋‹ˆ๋ผ๋ฉด, NoSQL์˜ ๋ณธ์งˆ์  ๊ฐ•์ ์„ ํ™œ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ง€ Document ํ˜•ํƒœ๊ฐ€ ์ง๊ด€์ ์ด๋‹ค๋ผ๋Š” ๋ถ€์ˆ˜์  ์ด์œ ๋กœ ์„ ํƒํ•œ ๊ฑฐ์˜ˆ์š”. ๊ทธ๋Ÿผ ๊ทธ๊ฑด NoSQL์˜ ์ฒ ํ•™์„ ๋”ฐ๋ฅธ๋‹ค๊ธฐ๋ณด๋‹ค๋Š” JSON ์ €์žฅ์†Œ๋กœ ์“ฐ๋Š” ๊ฒƒ์— ๊ฐ€๊นŒ์›Œ์š”.

์ €๋Š” ๋ˆ„๋ˆ„์˜ ๋„์ „ ์ •์‹ ๊ณผ MongoDB๋ฅผ ๊นŠ์ด ๊ณต๋ถ€ํ•œ ์ ์€ ์ •๋ง ๋†’์ด ํ‰๊ฐ€ํ•ด์š”.

๋‹ค๋งŒ ๊ฐ ๋„๊ตฌ๋Š” ์ž๊ธฐ๊ฐ€ ์ž˜ํ•˜๋Š” ์˜์—ญ์ด ์žˆ๊ณ , ๊ทธ ์˜์—ญ์— ๋งž์ถฐ ์“ธ ๋•Œ ์ง„์งœ ๊ฐ€์น˜๊ฐ€ ๋‚˜์˜จ๋‹ค๋Š” ๊ฒŒ ์ œ ์ƒ๊ฐ์ด์—์š”. ๋ˆ„๋ˆ„๊ฐ€ MongoDB๋ฅผ ์ง์ ‘ ์จ๋ณด๊ณ  ๊ทธ trade-off๋ฅผ ์ฒด๊ฐํ•œ ๊ฒƒ ์ž์ฒด๊ฐ€ ๊ฐ€์žฅ ํฐ ํ•™์Šต์ด๊ณ , ๊ทธ ๊ฒฝํ—˜์ด ๋‚˜์ค‘์— ์ด ํ”„๋กœ์ ํŠธ์—” ์–ด๋–ค DB๋ฅผ ์จ์•ผ ํ• ๊นŒ? ๊ฒฐ์ •ํ•  ๋•Œ ์ง„์งœ ์ž์‚ฐ์ด ๋  ๊ฑฐ์˜ˆ์š”!

๋‹ค์‹œ ํ•œ๋ฒˆ, ์ฑ…๊นŒ์ง€ ์ฐพ์•„๋ณด๋ฉด์„œ ๋‹ต๋ณ€ํ•ด์ฃผ์…”์„œ ์ •๋ง ๊ฐ์‚ฌํ•ด์š”! ์ด๋Ÿฐ ๊นŠ์ด ์žˆ๋Š” ํ† ๋ก ์ด ์ง„์งœ ์„ฑ์žฅ์„ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š” ใ…Žใ…Ž

Comment thread src/main/java/controller/JanggiController.java Outdated
Comment on lines +52 to +53
Board board = boardDao.findBoardByGameId(gameId);
int turnCount = boardDao.findTurnCountByGameId(gameId);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋‘ ๋ฉ”์„œ๋“œ ๋ชจ๋‘ _id๋กœ ๊ฐ™์€ Document๋ฅผ ์กฐํšŒํ•˜๋Š”๋ฐ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด 2๋ฒˆ ๋‚˜๊ฐ€๊ณ  ์žˆ์–ด์š”. ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ์—์„œ Document๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์กฐํšŒํ•ด์„œ Board์™€ turnCount๋ฅผ ๊ฐ™์ด ๋ฐ˜ํ™˜ํ•˜๋ฉด ์–ด๋–จ๊นŒ์š”?

์ด๊ฑธ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•˜๋ฉด Board์™€ turnCount๋ฅผ ๋ฌถ์–ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•ด์ง€๋Š”๋ฐ์š”, ์ด๊ฒŒ ์‚ฌ์‹ค ๋ˆ„๋ˆ„๊ฐ€ PR ์„ค๋ช…์—์„œ ์–ธ๊ธ‰ํ•œ DTO์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋„์ž… ์‹œ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”.

Copy link
Copy Markdown
Author

@LEEJaeHyeok97 LEEJaeHyeok97 Apr 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ด๊ฑธ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•˜๋ฉด Board์™€ turnCount๋ฅผ ๋ฌถ์–ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•ด์ง€๋Š”๋ฐ์š”, ์ด๊ฒŒ ์‚ฌ์‹ค ๋ˆ„๋ˆ„๊ฐ€ PR ์„ค๋ช…์—์„œ ์–ธ๊ธ‰ํ•œ DTO์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋„์ž… ์‹œ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”.

์ด ๋ง์”€์ด ์ด๋ฒˆ ๋ฏธ์…˜์„ ํ†ตํ‹€์–ด ์ •๋ง ์ธ์ƒ๊นŠ์€ ๋ง ๊ฐ™์Šต๋‹ˆ๋‹ค. DTO๋ผ๋Š” ์ƒˆ๋กœ์šด ๋„๊ตฌ์˜ ๋„์ž…์„ ์–ธ์ œ ํ•ด์•ผํ• ์ง€ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ DB๊ฐ€ ์—ฐ๊ฒฐ๋˜๊ณ  ํ•˜๋‚˜์˜ Document์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก DTO๋ฅผ ๋„์ž…ํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ์š”์ฒญ๋„ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฝ”๋“œ๋„ ์š”์ฒญ์ด ์ค„์–ด๋“  ๋งŒํผ ๋ฐ์ดํ„ฐ ํ˜ธ์ถœ์„ ์œ„ํ•œ ์ฝ”๋“œ๊ฐ€ ์ค„์–ด๋“ค์–ด ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ์ƒˆ๋กœ์šด ๋„๊ตฌ์˜ ๋„์ž… ์ง€์ ์ด๋ผ๋Š” ๋ฐ ๊ณต๊ฐํ•ฉ๋‹ˆ๋‹ค.

@LEEJaeHyeok97
Copy link
Copy Markdown
Author

LEEJaeHyeok97 commented Apr 11, 2026

์œตํ•ฉ์†Œํ”„ํŠธ์›จ์–ดํ•™๋ถ€๋ฅผ ์กธ์—…ํ•œ ์ „๊ณต์ž ๋งž์Šต๋‹ˆ๋‹ค!
:)

๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” redis ๋“ฑ ๋‹ค๋ฅธ ๊ฒƒ๋„ ๋งŽ์ง€๋งŒ, ์ฒ˜์Œ์— Redis ์‚ฌ์šฉ์„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์œ ๋Š” ๋ ˆ๋””์Šค๊ฐ€ ์ธ๋ฉ”๋ชจ๋ฆฌ DB์ด๊ณ  ๋งˆ๋น„๋…ธ๊ธฐ ๊ฐ™์€ ๊ฒŒ์ž„์˜ DB๋กœ๋„ ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ์žฅ๊ธฐ๊ฒŒ์ž„์— ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ• ๊นŒ๋ผ๋Š” ์ƒ๊ฐ์œผ๋กœ ๊ณ ๋ฏผ์„ ์‹œ์ž‘ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์•„์š”.
Redis๋ฅผ ๊ณ ๋ คํ–ˆ์„ ๋•Œ ์žฅ๊ธฐ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ Key-Value ํ˜•ํƒœ๋กœ ์ €์žฅ์„ ํ•ด์•ผํ•ด์„œ ์–ด๋–ค ๊ฐ’์„ Key๋กœ ์žก๋Š”๊ฐ€๊ฐ€ ์„ค๊ณ„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๊ณ  ๋А๊ปด์„œ RDBMS๋ณด๋‹ค ๊ทธ๋Ÿผ ์žฅ์ ์ด ์—†๋Š” ๊ฒƒ ์•„๋‹Œ๊ฐ€? ์–ด์ฐจํ”ผ RDB๋„ ํ…Œ์ด๋ธ”์„ ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋Š”๋ฐ ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๊ณ  Redis๋Š” ์„ ํƒ์ง€์—์„œ ์ง€์› ์Šต๋‹ˆ๋‹ค.
๋˜ ํ…Œ์ด๋ธ” ๊ฐœ๋…์ด ์—†์–ด์„œ redis๋Š” prefix๋กœ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์„ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•˜๋Š”๊ฒŒ ๋ถˆํŽธํ–ˆ๋Š”๋ฐ,
MongoDB๋Š” collection์ด๋ผ๋Š” ํ…Œ์ด๋ธ” ๊ฐœ๋…์ด ์žˆ๋Š” NoSQL DB์˜€๊ณ  ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” DB ๋ผ๋Š” ์ ์ด ํฐ ์žฅ์ ์œผ๋กœ ๋А๊ปด์กŒ์Šต๋‹ˆ๋‹ค.

๊ทธ ์ด์œ ๋กœ๋Š” MySQL ๊ฐ™์€ RDB๋กœ ํ…Œ์ด๋ธ” ์„ค๊ณ„ ์‹œ,
Game(id, turn) -1:N - PieceType(id, game_id, type) - 1:N - Piece(id, piece_type_id, team, row, col)
์ด๋Ÿฐ ์‹์œผ๋กœ ์„ค๊ณ„๊ฐ€ ๋  ๊ฒƒ ๊ฐ™์€๋ฐ, ๊ทธ๋Ÿฌ๋ฉด ๋งค๋ฒ„ ์žฅ๊ธฐ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ณ  ์กฐํšŒํ•˜๋Š”๋ฐ, RDB์˜ ๊ฒฝ์šฐ ์กฐ์ธ์ด
๋งŽ์•„์ง€๊ณ , ์ €ํฌ ํ† ๋ก ์กฐ์˜ ์‚ฐ์ถœ๋ฌผ์ด ๋งค ์ž…๋ ฅ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ๋ฃฐ๋กœ ์ •ํ•ด์กŒ์œผ๋ฏ€๋กœ ๋งค๋ฒˆ ์ž…๋ ฅ๋งˆ๋‹ค
์ €์žฅํ•˜๊ธฐ์—๋Š” RDB๋ณด๋‹ค NoSQL ์žฅ์ ์ด ์žˆ๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค๋ฉด MySQL์€ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๊ณ  B-Tree ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ๋„ ํ•ด์•ผํ•˜๊ณ  ์กฐ์ธ์„ ๋งค ์š”์ฒญ๋งˆ๋‹ค O(N)์œผ๋กœ ํƒ์ƒ‰ํ•ด์„œ ํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค NoSQL์ธ MongoDB๊ฐ€ ๋‹จ์ˆœํžˆ Document๋งŒ ์ €์žฅํ•˜๋Š”๊ฒŒ ๋‹ค ์ด๋ฏ€๋กœ ํ˜„์žฌ ๋‹จ์ˆœํžˆ ์žฅ๊ธฐํŒ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊บผ๋‚ด๋Š” ์ƒํ™ฉ์—์„œ ํšจ์œจ์ ์ธ ํŒ๋‹จ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

Document ์ˆ˜์ • ์‹œ์—๋„ ์ „์ฒด ๋ฌธ์„œ๋ฅผ ๋ฎ์–ด์“ฐ๊ธฐํ•˜๋Š” ๋ฐฉ์‹๋ง๊ณ  ๋ถ€๋ถ„ field๋งŒ ๊บผ๋‚ด updateํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ Document ํ•„๋“œ offset์„ ํ†ตํ•ด ์ „์ฒด ๋ฌธ์„œ๋ฅผ ๊ต์ฒดํ•˜์ง€ ์•Š๊ณ  ํŠน์ • ํ•„๋“œ๋งŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค!

RDB๋Š” ์žฅ๊ธฐํŒ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋ ค๋ฉด Game ํ…Œ์ด๋ธ”๊ณผ Piece ํ…Œ์ด๋ธ” ๋“ฑ์„ ๋‚˜๋ˆ„๊ณ  ์™ธ๋ž˜ํ‚ค๋กœ ์—ฐ๊ฒฐํ•˜๊ณ  ์กฐ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ฌผ ํ•˜๋‚˜๋ฅผ ์›€์ง์ผ ๋•Œ๋งˆ๋‹ค Piece ๋“ฑ์—์„œ ํŠน์ • ํ–‰์„ ์ฐพ์€ ํ›„ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ , ์กฐํšŒ์‹œ์—๋Š” ๋˜ ๋‹ค์‹œ ์—ฌ๋Ÿฌ ํ–‰์„ Joinํ•ด์„œ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ACID ์›์น™์— ์˜ํ•œ ์—„๊ฒฉํ•œ ๊ฒ€์ฆ ์ ˆ์ฐจ๋Š” ๋ค์ด๊ณ ์š”

MongoDB๋Š” BASE ์›์น™์„ ๋”ฐ๋ผ RDB๋ณด๋‹ค ์œ ์—ฐํ•œ ์›์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์žฅ๊ธฐํŒ ์ž์ฒด๋ฅผ ํ•˜๋‚˜์˜ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ(์—ฐ๊ด€๋œ ๊ฐ์ฒด ๋ฌถ์Œ)์œผ๋กœ ๋ณด๊ณ , ๊ฒŒ์ž„ ํ•˜๋‚˜ = ๋ฌธ์„œ ํ•˜๋‚˜๋ผ๋Š” ์ง๊ด€์ ์ธ ๊ตฌ์กฐ ๋•๋ถ„์— ์ฝ”๋“œ๊ฐ€ ๋‹จ์ˆœํ•ด์ง€๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๋‹จ ํ•œ ๋ฒˆ์˜ ๋””์Šคํฌ I/O๋กœ ํŒ ์ „์ฒด ์ƒํƒœ๋ฅผ ๋ณต์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, NoSQL์ด ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง์˜ ํšจ์œจ์„ฑ์˜ ์ด์ ์ด ํฌ๊ณ  ์žฆ์€ ์ €์žฅ์ด ํ•„์š”ํ•œ ์žฅ๊ธฐ ๊ฒŒ์ž„์—์„œ ์†๋„๋„ ๋น ๋ฅด๋‹ค๋ฉด ์„ ํƒํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ
https://www.youtube.com/watch?v=DrEDCn4X7gQ

๋งˆ๋น„๋…ธ๊ธฐ ๋ชจ๋ฐ”์ผ์€ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํ˜์‹ ์„ ์œ„ํ•ด Amazon MemoryDB๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

Copy link
Copy Markdown

@her0807 her0807 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์•ˆ๋…•ํ•˜์„ธ์š” ๋ˆ„๋ˆ„

๋ฆฌ๋ทฐ์–ด ์ˆ˜๋‹ฌ์ž…๋‹ˆ๋‹ค! ๋‹ต๋ณ€์ฃผ์‹  ๋‚ด์šฉ์— ๋Œ€ํ•ด ์ถ”๊ฐ€ ์˜๊ฒฌ ์ ์–ด๋‘์—ˆ์–ด์š”.

์š”๊ตฌ์‚ฌํ•ญ์€ ์ถฉ์กฑ๋œ ๊ฒƒ ๊ฐ™์•„ ์ด๋งŒ ๋จธ์ง€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ๊ณ ์ƒ ๋งŽ์œผ์…จ์–ด์š”:)

@her0807 her0807 merged commit 70735a3 into woowacourse:leejaehyeok97 Apr 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants